<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // ### let 和 const 关键字
        /* 
            let 和const  --代替原来的 var

            let  定义变量
            const 定义常量
                --定义以后不能重新赋值-定义的时候需要要赋值

            和 var 有什么区别     
                ---let` 和 `const` 不允许重复声明变量
                ---let` 和 `const` 声明的变量不会在预解析的时候解析（也就是没有变量提升）
                ---****let` 和 `const` 声明的变量会被所在代码块限制作用范围（块级作用域）
                    js以前有两种作用域--全局--局部（函数内）--块级作用域）局部的） { }

```javascript
// var 声明的变量只有函数能限制其作用域，其他的不能限制
if (true) {
  var num = 100//全局变量
}
console.log(num) // 100
```
        
        */
        let a = 1;
        console.log(a);
        a = 10;
        console.log(a);

        const age = 1;
        // 重新赋值常量会报错 - Assignment to constant variable.
        // age = 19;--
        const PI = 3.1415926;
        const obj = { name: 'zhangsan' };
        // 重新赋值常量会报错
        // obj = { age: 19 };
        // 修改对象的属性不报错
        obj.name = 'aaabb'


        // 不能重复声明
        var b = 100;
        var b = 200;
        console.log(b);

        let pp = 100;
        // let pp = 200;

        // let b = 1;//Identifier 'b' has already been declared

        // 没有声明提升

        console.log(num);//undefined
        var num = 1;
        // console.log(num2);
        // Cannot access 'num2' before initialization
        // 暂时性死区
        // let 和const 定义的变量 只能在定义后使用，定义之前的部分都不能使用
        setTimeout(function () {
            console.log(num2);
        }, 5000)
        let num2 = 1;

        if (1) {
            // 跨级作用域---y是局部变量
            let y = 1;//
            var e = 1;
        }
        // console.log(y);  y is not defined
        console.log(e);

        // i是全局变量，循环结束以后i是5
        // ** 循环瞬间启动五个延时器，5000后，他们都打印全局变了i 
        for (var i = 0; i < 5; i++) {
            console.log(i);//0-4
            // setTimeout(function () {
            //     console.log(i, 'var i-for ');//
            // }, 5000)
        }
        console.log(i);//5


        // ** 循环瞬间启动五个延时器，5000后，他们都打印全局变了i 
        // 每个作用域 都有一个自己的 延时器和 j
        // 循环 会产生五个 局部 j  ， 五个局部作用域
        for (let j = 0; j < 5; j++) {
            console.log(j);//
            setTimeout(function () {
                console.log(j, 'let j-for ');//
            }, 5000)
        }

        // j is not defined j是局部变量
        // console.log(j);
        // {
        //     let j = 0
        //     console.log(j);
        //     setTimeout(function () {
        //         console.log(j, 'let j-for ');//
        //     }, 5000)
        // }
        // {
        //     let j = 1
        //     console.log(j);
        //     setTimeout(function () {
        //         console.log(j, 'let j-for ');//
        //     }, 5000)
        // }









    </script>

</body>

</html>